#include<iostream>
#include<string>
#include<unistd.h>
#include<sys/msg.h>
#include<string.h>

using namespace std;
#define  CHILD_PROCESS_WRITE 1
#define  FATHER_PROCESS_WRITE 2

//最好自己定义msgbuf，别用系统自带的
struct mymsgbuf
{
    long mtype;
    char mtext[90];
};

// int main()
// {
//     int pid = fork();
//     if(pid<0)
//     {
//         perror("fork");
//         return -1;
//     }
//     key_t k = ftok("mycodetest",1);
//     int msgid=msgget(k,IPC_CREAT|0666);
//     if(0==pid)
//     {
//         //子进程，读写消息
//         char s[50]="hello,i am child process";
//         int t=10;
//         while(t--)
//         {
//             //发送消息
//             s[24]=t+'0';
//             s[25]='\0';
//             struct mymsgbuf mb_w;
//             mb_w.mtype=CHILD_PROCESS_WRITE;
//             strcpy(mb_w.mtext,s);
//             if(-1==msgsnd(msgid,&mb_w,strlen(mb_w.mtext)+1,0))
//             {
//                 perror("msgsnd");
//             }

//             //接收消息
//             struct mymsgbuf mb_r;
//             if(-1==msgrcv(msgid,&mb_r,sizeof(mb_r.mtext),FATHER_PROCESS_WRITE,0))
//             {
//                 perror("msgrcv");
//             }
//             else
//             {
//                 printf("child process read:%s\n",mb_r.mtext);
//                 sleep(1);
//             }
//         }

//         //return 0;
//     }
//     if(pid>0)
//     {
//         //父进程，读写消息
//         char s[50]="hello,i am father process";
//         int t=10;
//         while(t--)
//         {
//             //发送消息
//             struct mymsgbuf mb_w;
//             s[24]=t+'0';
//             s[25]='\0';
//             mb_w.mtype=FATHER_PROCESS_WRITE;
//             strcpy(mb_w.mtext,s);
//             if(-1==msgsnd(msgid,&mb_w,strlen(mb_w.mtext)+1,0))
//             {
//                 perror("msgsnd");
//             }

//             //接收消息
//             struct mymsgbuf mb_r;
//             if(-1==msgrcv(msgid,&mb_r,sizeof(mb_r.mtext),CHILD_PROCESS_WRITE,0))
//             {
//                 perror("msgrcv");
//             }
//             else
//             {
//                 printf("father process read:%s\n",mb_r.mtext);
//                 sleep(1);
//             }
//         }
//      }
    
//     msgctl(msgid,IPC_RMID,NULL);
//     return 0;
// }




int main()
{
    int pid = fork();
    if(pid<0)
    {
        perror("fork");
        return -1;
    }
    key_t k = ftok("mycodetest",1);
    int msgid=msgget(k,IPC_CREAT|0666);
    if(0==pid)
    {
        //子进程，读写消息
        char s[]="hello,i am child process";
        int t=10;
        while(t--)
        {
            s[24]=t+'0';
            s[25]='\0';
            struct mymsgbuf mb_r;
            struct mymsgbuf mb_w;
            mb_w.mtype=CHILD_PROCESS_WRITE;
            strcpy(mb_w.mtext,s);
            if(-1==msgsnd(msgid,&mb_w,strlen(mb_w.mtext)+1,0))
            {
                perror("child msgsnd");
            }
            if(-1==msgrcv(msgid,&mb_r,sizeof(mb_r.mtext),FATHER_PROCESS_WRITE,0))
            {
                perror("child msgrcv");
            }
            printf("child process read:%s\n",mb_r.mtext);
            sleep(1);
        }
        return 0;
    }
    else
    {
        //父进程，读写消息
        char s[]="hello,i am father process";
        int t=10;
        while(t--)
        {
            s[24]=t+'0';
            s[25]='\0';
            struct mymsgbuf mb_r;
            struct mymsgbuf mb_w;
            mb_w.mtype=FATHER_PROCESS_WRITE;
            strcpy(mb_w.mtext,s);
            if(-1==msgsnd(msgid,&mb_w,strlen(mb_w.mtext)+1,0))
            {
                perror("father msgsnd");
            }
            if(-1==msgrcv(msgid,&mb_r,sizeof(mb_r.mtext),CHILD_PROCESS_WRITE,0))
            {
                perror("msgrcv");
            }
            printf("father process read:%s\n",mb_r.mtext);
            sleep(1);
        }
    }
    msgctl(msgid,IPC_RMID,NULL);

    return 0;
}

// int main()
// {
//     int pid = fork();
//     if(pid<0)
//     {
//         perror("fork");
//         return -1;
//     }
//     key_t k = ftok("mycodetest",1);
//     int shmid=shmget(k,4096,IPC_CREAT|0666);
//     if(0==pid)
//     {
//         //子进程，读取
//         int t=10;
//         while(t--)
//         {
//             char* com=(char*)shmat(shmid,nullptr,0);
//     		printf("%s\n",com);
//             sleep(1);
//         }
//     }
//     if(pid>0)
//     {
//         //父进程，写入
//         int t=10;
//         while(t--)
//         {
//             char* com=(char*)shmat(shmid,nullptr,0);
//             string tmp("hello,i am father process");
//             tmp+=t+'0';
//             int i=0;
//             while(i<tmp.size())
//             {
//                 com[i]=tmp[i];
//                 ++i;
//             }
//             com[i]='\0';
//             sleep(1);
//         }
//     }
    
//     shmctl(shmid,IPC_RMID,nullptr);
//     return 0;
// }